{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f8506dec",
   "metadata": {},
   "source": [
    "# NeuralCompression Metrics Example\n",
    "\n",
    "## Introduction\n",
    "\n",
    "Welcome! This notebook will walkthrough using the `neuralcompression.metrics` and `torchmetrics` packages to evaluate models using rate distortion curves. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c78b190",
   "metadata": {},
   "source": [
    "First, if you haven't yet installed `neuralcompression`, do so below with: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "65e39feb",
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install git+https://github.com/facebookresearch/NeuralCompression/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3a2819bd",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n"
     ]
    }
   ],
   "source": [
    "from collections import defaultdict\n",
    "import io\n",
    "\n",
    "import torch\n",
    "from torch.utils.data import DataLoader\n",
    "\n",
    "from compressai import zoo\n",
    "\n",
    "import torchmetrics as tm\n",
    "import torchmetrics.functional as tmF\n",
    "\n",
    "import neuralcompression as nc\n",
    "import neuralcompression.functional as ncF\n",
    "import neuralcompression.metrics as ncm\n",
    "\n",
    "import torchvision.transforms as tfms\n",
    "\n",
    "from tqdm import tqdm\n",
    "\n",
    "import math\n",
    "from PIL import Image\n",
    "\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4d82ff1a",
   "metadata": {},
   "source": [
    "## Finding And Using Metrics\n",
    "\n",
    "The metrics implemented in `neuralcompression.metrics` aim to complement/extend those aready in `torchmetrics`. `torchmetrics` features high-quality implementations of MSE, PSNR, FID, KID, and more (check the [package documentation](https://torchmetrics.readthedocs.io/en/latest/references/modules.html) for a complete list), and are therefore not reimplemented inside of `neuralcompression`. \n",
    "\n",
    "Most of the metrics supported in `torchmetrics` have both functional and `nn.Module`-based APIs. Module metrics add additional functionality like accumulation across batches and first-class [compatibility](https://torchmetrics.readthedocs.io/en/latest/pages/lightning.html) with PyTorch Lightning."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9da5dda0",
   "metadata": {},
   "outputs": [],
   "source": [
    "image_shape = (1,3,256,256)\n",
    "\n",
    "image_a = torch.randn(image_shape)\n",
    "image_b = torch.randn(image_shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "48c78fe8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor(15.3505), tensor(15.3505))"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "psnr_metric = tm.PSNR()\n",
    "psnr_module = psnr_metric(image_a, image_b)\n",
    "psnr_functional = tmF.psnr(image_a, image_b)\n",
    "\n",
    "psnr_module, psnr_functional"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "333d24c2",
   "metadata": {},
   "source": [
    "Metrics that are missing from `torchmetrics` that are otherwise important to compression, such as MS-SSIM and LPIPS, can be found in `neuralcompression`. Similar to `torchmetrics`, each metric has a functional API that can be imported from `neuralcompression.functional`, and a Module API found in `neuralcompression.metrics`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "201b16a3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor(0.0042), tensor(0.0042))"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ms_ssim_metric = ncm.MultiscaleStructuralSimilarity()\n",
    "\n",
    "ms_ssim_module = ms_ssim_metric(image_a, image_b)\n",
    "ms_ssim_functional = ncF.multiscale_structural_similarity(image_a, image_b)\n",
    "\n",
    "ms_ssim_module, ms_ssim_functional"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7868d67",
   "metadata": {},
   "source": [
    "Module-based metrics in `neuralcompression` are instances of `torchmetrics.Metric`, so they are fully compatible with other `torchmetrics` features, like metric collections."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "0f2ff7f2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'PSNR': tensor(15.3505), 'MultiscaleStructuralSimilarity': tensor(0.0042)}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Using metrics from both torchmetrics and neuralcompression\n",
    "collection = tm.MetricCollection(\n",
    "    psnr_metric,\n",
    "    ms_ssim_metric\n",
    ")\n",
    "\n",
    "collection(image_a, image_b)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ec940812",
   "metadata": {},
   "source": [
    "## Calculating Rate-Distortion Curves\n",
    "\n",
    "We'll now go through an example of calculating rate-distortion curves for the [scale hyperprior model](https://arxiv.org/abs/1802.01436) on the [Kodak dataset](http://www.cs.albany.edu/~xypan/research/snr/Kodak.html), comparing it to the non-ML image codec JPEG."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "9ac1e4bf",
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_jpeg_rd_curve(dataloader, metrics: tm.MetricCollection):\n",
    "        \n",
    "    rd_curve = []\n",
    "    to_PIL = tfms.ToPILImage()\n",
    "    to_tensor = tfms.ToTensor()\n",
    "    \n",
    "    for quality in tqdm(range(0, 91, 10)):\n",
    "        \n",
    "        bpp_sum = 0.0\n",
    "        metrics_sum = defaultdict(lambda: 0.0)\n",
    "        \n",
    "        for img in dataloader:\n",
    "            pil_image = to_PIL(img.squeeze(0))\n",
    "            buffer = io.BytesIO()\n",
    "            pil_image.save(buffer, format=\"JPEG\", quality=quality)\n",
    "            \n",
    "            bits = len(buffer.getvalue()) * 8\n",
    "            bpp = bits / (img.shape[2] * img.shape[3])\n",
    "            \n",
    "            bpp_sum += bpp\n",
    "            \n",
    "            reconstruction = to_tensor(Image.open(buffer, formats=[\"JPEG\"])).unsqueeze(0)\n",
    "            \n",
    "            distortions = metrics(img, reconstruction)\n",
    "            for k,v in distortions.items():\n",
    "                metrics_sum[k] += v\n",
    "        \n",
    "        average_metrics = {k: v / len(dataloader) for k,v in metrics_sum.items()}\n",
    "        average_bpp = bpp_sum / len(dataloader)\n",
    "        \n",
    "        rd_curve.append((average_bpp, average_metrics))\n",
    "    \n",
    "    return rd_curve\n",
    "\n",
    "def make_scale_hyperprior_rd_curve(dataloader, metrics: tm.MetricCollection):\n",
    "    rd_curve = []\n",
    "    to_tensor = tfms.ToTensor()\n",
    "        \n",
    "    for quality in tqdm(range(1, 9)):\n",
    "        \n",
    "        bpp_sum = 0.0\n",
    "        metrics_sum = defaultdict(lambda: 0.0)\n",
    "        \n",
    "        model = zoo.bmshj2018_hyperprior(quality=quality, pretrained=True)\n",
    "        model.eval()\n",
    "        model.update()\n",
    "        with torch.no_grad():\n",
    "            for img in dataloader:         \n",
    "                compressed = model.compress(img)\n",
    "                bits = 0.0\n",
    "                for string_list in compressed[\"strings\"]: # strings for image + hyper latent\n",
    "                    for string in string_list: # iterating over batch\n",
    "                        bits += len(string) * 8\n",
    "\n",
    "                bpp = bits / (img.shape[0] * img.shape[2] * img.shape[3])\n",
    "\n",
    "                bpp_sum += bpp\n",
    "\n",
    "                reconstruction = model.decompress(**compressed)[\"x_hat\"]\n",
    "                distortions = metrics(img, reconstruction)\n",
    "                for k,v in distortions.items():\n",
    "                    metrics_sum[k] += v\n",
    "\n",
    "            average_metrics = {k: v / len(dataloader) for k,v in metrics_sum.items()}\n",
    "            average_bpp = bpp_sum / len(dataloader)\n",
    "            rd_curve.append((average_bpp, average_metrics))\n",
    "        \n",
    "        del model\n",
    "    \n",
    "    return rd_curve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d1070f27",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Pass download=True if dataset doesn't exist already\n",
    "ds = nc.data.Kodak(\"kodak\", transform = tfms.ToTensor())\n",
    "dl = DataLoader(ds, batch_size = 1)\n",
    "metrics = tm.MetricCollection(\n",
    "    tm.PSNR(), \n",
    "    tm.MeanSquaredError(), \n",
    "    ncm.MultiscaleStructuralSimilarity()\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "3835c509",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 10/10 [01:30<00:00,  9.03s/it]\n"
     ]
    }
   ],
   "source": [
    "jpeg_curve = make_jpeg_rd_curve(dl, metrics)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "a109e7e1",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 8/8 [03:27<00:00, 25.95s/it]\n"
     ]
    }
   ],
   "source": [
    "shp_curve = make_scale_hyperprior_rd_curve(dl, metrics)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f83262f",
   "metadata": {},
   "source": [
    "## Plotting the Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "cf0380a7",
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_rd_curve(names_to_rd_curves, metric_name, y_label = None, y_transform = None):       \n",
    "    plot = plt.axes()\n",
    "\n",
    "    plot.set_title(f\"{metric_name} vs bits-per-pixel\")\n",
    "    plot.set_xlabel(\"bits per pixel\")\n",
    "    \n",
    "    if y_label is None:\n",
    "        plot.set_ylabel(metric_name)\n",
    "    else:\n",
    "        plot.set_ylabel(y_label)\n",
    "        \n",
    "    for codec_name, curve in names_to_rd_curves.items():\n",
    "        x_data = [data[0] for data in curve]\n",
    "        y_data = [data[1][metric_name] for data in curve]\n",
    "            \n",
    "        if y_transform is not None:\n",
    "            y_data = [y_transform(y) for y in y_data]\n",
    "        \n",
    "        line, = plot.plot(x_data, y_data)\n",
    "        line.set_label(codec_name)\n",
    "\n",
    "    plot.grid()\n",
    "    plot.legend()\n",
    "    \n",
    "    return plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "3c6da35c",
   "metadata": {},
   "outputs": [],
   "source": [
    "curve_dict = {\"JPEG\": jpeg_curve, \"Scale Hyperprior\": shp_curve}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "d0ae0b0e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:title={'center':'PSNR vs bits-per-pixel'}, xlabel='bits per pixel', ylabel='PSNR'>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_rd_curve(curve_dict, \"PSNR\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "5ba8df48",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:title={'center':'MeanSquaredError vs bits-per-pixel'}, xlabel='bits per pixel', ylabel='MeanSquaredError'>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEWCAYAAABxMXBSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABB7ElEQVR4nO3deXxU1fn48c+TyUoCYcnCTkhAFFGQ1Z2IiqBVbKUF1Lqhfm3Vn367fNXaWmulVWtrra1VCrgrKFqLijvGpSqriCwiYVECKGsCCVknz++PexMmk0kyA5lMMnner9e8uHO3ee5JmCfnnHvPEVXFGGOMCVZMpAMwxhjTtljiMMYYExJLHMYYY0JiicMYY0xILHEYY4wJiSUOY4wxIbHEYUwAInKniDwd6Tiam4g8LiJ3N7K9WESyWzKmcBCRNSKSe4TnuEJEPmqeiKKLJY4oJiJbRKRCRNL81n8mIioiWS0Qw3QR+VJEDojIdyKyUEQ6hvtzm5OIZLnlVez3mhLp2Jqbqqao6iZoOsm0Zqp6rKrmRTqOaGWJI/ptBqbVvBGR44AOLfHBIjIW+AMwTVU7AscA81ris/3iiG2mU3V2v1hrXgGvRUQ8R/L5zRhvVLDyaH0scUS/p4DLfN5fDjzpu4OIJIjI/SLyjVsreEREktxtXUTkVRHZJSL73OXePsfmicjvReS/bq3iLZ8azijgE1X9DEBV96rqE6p6wD22m4gsEJH9IrLEPc9H7raav/Jj/T7ranc5R0QWicgeEdktIs+ISGeffbeIyC0isgooEZFYETlRRD4WkUIR+dy3KUNE+ovI++41vA3UqaU1xv3L/J9ubaoEOKOBz7/AbUIpdK/lmMbi9fuMf4rI/X7r/iMiP3OXbxGRbW7860XkzEZCThORt9193xeRfj7nVBEZICLXApcA/+fWrl4J5XN8fn7Xish2EdkhIr/w2R4jIreKyEb3Z/i8iHT1O3a6iHwDLApw/jtFZL6IzHNjWSEiQ/3K8yx3eaGI/Nln21wRmeMup4rIbDe+bSJyt/glfhOAqtorSl/AFuAsYD3OX/seoADoByiQ5e73ALAA6Ap0BF4B/uhu6wZchFNL6Qi8ALzs8xl5wEbgKCDJfX+Pu+00oBT4HXAKkOAX31zgeSAZGAJsAz5yt2W5Mcb6fdbV7vIA4GwgAUgHPgD+6nftK4E+bly9gD3AuTh/MJ3tvk939/8E+It7vtOBA8DTDcXidx2PA0XuNcYAiQE+/yigxP3cOOD/gHwgPlC8AT7jdGArIO77Lm7Z9gQGudt6+sSb00isB9zzJQAP1pS5u12BAT773u2zLZTPqSmz59yf73HALuAsd/tNwKdAbzeOR4Hn/I590j02UHncCVQCk93y/AVO7TrO93ffXe4O7ATG4STDTUBHd9u/3c9OBjKAJcD/uNuu8C0be/mUf6QDsFcYf7iHEsevgT8CE4C3gVj3P2YWIO4XWo7PcScBmxs45zBgn8/7PODXPu9/Crzh834iTiIqBIpxvpw97qsSONpn3z8QZOIIENeFwGd+136Vz/tbgKf8jnkTpwbWF6gCkn22PUv9xFHo9zrG3f448GSAsvf9/N8Az/u8j8FJlLmB9g9wfQJ8A5zuvr8GWOQuD8D5YjwL94uzkfM8Dsz1eZ8CeIE+7vvGEkcon1NTZr4/3/uA2e7yOuBMn2093N+HWJ9jsxs5/53Ap37luQM4zfd332f7RThJbzdwqrsuEyjHJzHhNOu+5y5fgSWOgC9rqmofngIuxvmP8KTftnSc2sRytwmlEHjDXY+IdBCRR0XkaxHZj/OXfWe/6vy3PssHcb6MAFDV11X1fJzazCQ3hqvd88fi/Geu8XWwFyQimW6TwzY3rqep37zke+5+wA9rrtG9zlNxvrB64iTDkiZiSVPVzj6vdQ18VqB1PX3PqarV7vZeTZyjZn/FqaHV9FddDDzjbssHbsb5Mt3plkvPhs7l+zmqWgzsdeNrVGOfI3VvGujbwDV97fM5/YB/+/ws1uEksEz/Y0XkEp9zv97AdVTj1KYbuo5XcP5YWa+qNXdK9cOprezwieNRnJqHaYQljnZAVb/GqcafC7zkt3k3TpPHsT5fiKmqWvPl/3OcJooxqtoJp4kDnL+AQ4mhWlXfxWmvHoLTbFGF0zRTw/cLp+ZL3Lcjv7vP8h9w/io9zo3r0gAx+Q79vBWnxuH7xZ+sqvfg/KXaRUSSG4glGIGGmfZdtx3niwoAERGca9/WxDl8PQdMdvskxgAv1h6o+qyqnsqhZsh7GzlPbZmLSApOUt/eRPyNfo7WvWngm0CfhVOmNZ+zFZjo9/NIVNV65aGqz/ice2ID1xGD0+wV6DoAZuAkpx4iUpN8t+LUOHz/IOikqsc2cA7jssTRfkwHxvn9VV3zl9q/gAdEJANARHqJyDnuLh1xEkuh23n522A/UEQmichUcTrYRURGA2Nxmhi8OEnsTrdWMxin2agmrl04X6qXiohHRK4CcnxO3xGn6atIRHoBv2winKeB80XkHPd8iSKSKyK93cS6DPidiMSLyKnA+cFeZ5CeB84TkTNFJA4nIZcDHwd7AnVuMtgNzALeVNVCABEZJCLjRCQBKMP5eVU3cqpzReRUEYkHfo/z8whU2/kOqH2m4zA+B+A37s/3WOBKDt1V9wgwo6ZjXkTSRWRSE+fyN0JEfiDOjQQ345Tnp/47icjp7mdfhvM79pCI9FLVHcBbwJ9FpJPbYZ8jzt2AphGWONoJVd2oqssa2HwLTkftp26zzzs4tQyAv+J07u7G+U/5Rggfuw+nLX4DUNOc9CdVfcbdfgNOs9a3OO3pj/kdfw1OQtgDHEvdL9nfAcNxOqVfo35Nqg73i3ES8Cuc2s5W99w1/wcuxvkrfi9OcvRv0gMnefo2yfyssc/0+/z1OLWih3DK8nzgfFWtCPYcrmdx+hie9VmXANzjnvdbnKaW25o4x29xrnWEG1cgs4HBbjPOy4fxOQDv4/xuvQvcr6pvuesfxLkh4y0ROYDzuzWmiXP5+w8wBef37MfAD1S10ncHEemE87O8QVW3qeqH7nU95tb6LgPigbXueebjNF+aRtTcoWFMxInIFTid36dGOhZzZMR5uLTmLqeqMJz/TpxO/IaSngkjq3EYY4wJiSUOY4wxIbGmKmOMMSGxGocxxpiQtIvBw9LS0jQrKyvSYURUSUkJycnJTe/YjliZ1GdlUld7Lo/ly5fvVtX0QNvaReLIyspi2bKG7kRtH/Ly8sjNzY10GK2KlUl9ViZ1tefyEJEGR3KwpipjjDEhscRhjDEmJJY4jDHGhKRd9HEYY45cZWUlBQUFlJWVRTqUFpOamsq6deua3rENS0xMpHfv3sTFxQV9jCUOY0xQCgoK6NixI1lZWTjDPEW/AwcO0LFjx0iHETaqyp49eygoKKB///5BH2dNVcaYoJSVldGtW7d2kzTaAxGhW7duIdciLXEYY4JmSSP6HM7P1BJHiLbuPcj9b65n696DkQ7FGGMiwhJHiIpKK/n7e/l8sa0o0qEY0y6lpKSwZcsWkpKSGDZsGIMHD+a6666jurq6zvqa15NPOlOrFBcX85Of/IScnByGDx/OiBEj+Ne//hXhq2mbrHM8RP3TnOEHNu0qjnAkxrRvOTk5rFy5kqqqKsaNG8fLL7/M8OHDa9f7u/rqq8nOzmbDhg3ExMSwa9cu5syZ0/KBRwGrcYQoOSGWHqmJbNxV0vTOxpiwi42N5eSTTyY/P7/BfTZu3MiSJUu4++67iYlxvvbS09O55ZZbWirMqGI1jsOQk55iNQ7Trv3ulTWs3b6/Wc85uGcnfnv+sSEfd/DgQd59913uuusuwEkSw4YNq93+0EMPsW/fPoYOHVqbNMyRscRxGLLTk3lpxTZU1e4yMSZCahKEiDBp0iQmTpzIli1bAjZVLViwoM77GTNm8MILL7Bz5062b9/eglFHB0schyEnPYXi8ip2HSgno1NipMMxpsUdTs2guTXUlxHI4MGD+fzzz6muriYmJobbb7+d22+/nZSUlPAGGaWs3nYYstOdDvJ8a64ypk0YMGAAI0eO5Ne//jVerxdwHmi0GVAPjyWOw5Cd7vyVssk6yI1pUVVVVSQkJDS6T00TVs3rb3/7GwCzZs1iz549tUnk7LPP5r777muJsKOONVUdhh6dEkmK87DRahzGtKg1a9aQk5NDVlYWq1evrrc9KyuL0tLSgMd26tSJRx99NNwhtgtW4zgMMTFC/7Rkq3EY04IeeeQRpk2bxt133x3pUNo9SxyHKScjxWocxrSg6667jrVr1zJ+/PhIh9LuhTVxiMgEEVkvIvkicmuA7QkiMs/dvlhEsny23eauXy8i57jrBonISp/XfhG5OZzX0JDstGS2FZZSVumNxMcbY0zEhC1xiIgH+AcwERgMTBORwX67TQf2qeoA4AHgXvfYwcBU4FhgAvCwiHhUdb2qDlPVYcAI4CDw73BdQ2NyMlJQhS17rLnKGNO+hLPGMRrIV9VNqloBzAUm+e0zCXjCXZ4PnCnOE3WTgLmqWq6qm4F893y+zgQ2qurXYbuCRmS7Y1Zt3GmJwxjTvoTzrqpewFaf9wXAmIb2UdUqESkCurnrP/U7tpffsVOB5xr6cBG5FrgWIDMzk7y8vNCvoBHlVc793+8u/YLkveub9dzhUFxc3Oxl0NZZmdTXWJmkpqZy4MCBlg0owrxeb7u45rKyspD+L7TJ23FFJB64ALitoX1UdSYwE2DkyJGam5vb7HH0XPou1cldyc09odnP3dzy8vIIRxm0ZVYm9TVWJuvWrYv4NKozZszg2WefxePxEBMTw6OPPsqYMf5/jzZuy5YtfO973wt4O6+/mqljU1JSKC4+dDPM448/zrJly/j73/8e8jWEw9VXX83PfvYzBg/27w0ITmJiIiecEPz3WDgTxzagj8/73u66QPsUiEgskArsCeLYicAKVf2uuYMORU5GCpt2W1OVMS3hk08+4dVXX2XFihUkJCSwe/duKioqIh1WWFRVVREbG9zXs9frZdasWSGd3+v14vF4Dic0ILx9HEuBgSLS360hTAUW+O2zALjcXZ4MLFJnDIAFwFT3rqv+wEBgic9x02ikmaqlZKcls3FnsQ1bYEwL2LFjB2lpabVPjqelpdGzZ08Ali5dysknn8zQoUMZPXo0Bw4cYMuWLZx22mkMHz6c4cOH8/HHH9c7p9fr5Ze//CWjRo3i+OOPD/kBwQMHDtC/f38qKysB2L9/f+373NxcbrrpJoYNG8aQIUNYssT5CispKeGqq65i9OjRnHDCCfznP/8BnFrMBRdcwLhx4zjzzDPJy8vj9NNP57zzzmPQoEG1k1WBM5nVz3/+c4YOHconn3xCbm4uy5YtA+C5557juOOOY8iQIXWGjfc/5kiErcbh9lncALwJeIA5qrpGRO4ClqnqAmA28JSI5AN7cZIL7n7PA2uBKuB6VfUCiEgycDbwP+GKPVg5GSmUVHjZeaCcTBvs0LQnr98K337RvOfsfhxMvKfBzePHj+euu+7iqKOO4qyzzmLKlCmMHTuWiooKpkyZwrx58xg1ahT79+8nKSmJjIwM3n77bRITE9mwYQPTpk2r/XKtMXv2bFJTU1m6dCnl5eWccsopjB8/nv79+9fZr7S0tM5Q7Xv37uWCCy6gY8eO5Obm8tprr3HhhRcyd+5cfvCDHxAXFwc4Q76vXLmSDz74gKuuuorVq1czY8YMxo0bx5w5cygsLGT06NGcddZZAKxYsYJVq1bRtWtX8vLyWLJkCWvXrqVfv35MmDCBl156icmTJ1NSUsKYMWP485//XCfO7du3c8stt7B8+XK6dOnC+PHjefnll7nwwgsbPOZwhLWPQ1UXAgv91t3hs1wG/LCBY2cAMwKsL8HpQI+47DRnzKqNO4stcRgTZikpKSxfvpwPP/yQ9957jylTpnDPPfcwYsQIevTowahRowBnaBFw/rK/4YYbWLlyJR6Ph6+++qreOd966y1WrVrF/PnzASgqKmLDhg31EkdSUlKdkXhr+jjA6V+47777uPDCC3nsscfqTEc7bdo0AE4//XT2799PYWEhb731FgsWLOD+++8HnI7pb775BoCzzz6brl271h4/evRosrOza8/10UcfMXnyZDweDxdddFG961m6dCm5ubmkp6cDcMkll/DBBx9w4YUXNnjM4WiTneOtRU6Ge0vu7hJOHpAW4WiMaUGN1AzCyePxkJubS25uLscddxxPPPEEI0aMCLjvAw88QGZmZu1w6omJ9f+4U1UeeughzjnnnMOO6ZRTTmHLli3k5eXh9XoZMmRI7Tb/+XpEBFXlxRdfZNCgQXW2LV68mOTk5Hr7B3qfmJgYch/F4RzTEBty5Ah075RIh3gPG3fa0CPGhNv69evZsGFD7fuVK1fSr18/Bg0axI4dO1i6dCng9DtUVVVRVFREjx49iImJ4amnnqodTt3XOeecwz//+c/aPoqvvvqKkpLQb3i57LLLuPjii7nyyivrrJ83bx4AH330EampqaSmpnLOOefw0EMP1faNfvbZZw2ed8mSJWzevJnq6mrmzZvHqaee2mgco0eP5v3332f37t14vV6ee+45xo4dG/L1NMVqHEdARMhOT7Y7q4xpAcXFxdx4440UFhYSGxvLgAEDmDlzJvHx8cybN48bb7yR0tJSkpKSeOedd/jpT3/KRRddxJNPPsmECRPq/TUPTjPTli1bGD58OKpKeno6L7/8csixXXLJJfz617+ubZqqUXOba2VlJXPmzAHgN7/5DTfffDPHH3881dXV9O/fn1dffTXgeUeNGsUNN9xAfn4+Z5xxBt///vcbjaNHjx7cc889nHHGGagq5513HpMm+T933QxUNepfI0aM0HC58dkVevIf3w3b+ZvLe++9F+kQWh0rk/oaK5O1a9e2XCCtxP79+4Pa74UXXtBLL720zrqxY8fq0qVLD/uz33vvPT3vvPMO+/hQBPrZ4tzEFPA71WocRygnPYVXVm2ntMJLUnzztB8aY9qOG2+8kddff52FCxc2vXOUsMRxhLLTk1GFzbtLGNyzU6TDMca0sIceeijg+iMdzqbmJoDWyDrHj1BOzTSyu62D3EQ/tYddo87h/EwtcRyh/jZKrmknEhMT2bNnjyWPKKKq7NmzJ+Ctyo2xpqojlBTvoVfnJKtxmKjXu3dvCgoK2LVrV6RDaTFlZWUhf6m2NYmJifTu3TukYyxxNIPs9GSbRtZEvbi4uHpPVEe7vLy8kEaNbS+sqaoZ5KSnsGlXiVXhjTHtgiWOZpCTnszBCi/f7i+LdCjGGBN2ljiaQe2dVbusg9wYE/0scTSDbDdxWD+HMaY9sMTRDDI7JZAc77EahzGmXbDE0QycwQ5TrMZhjGkXLHE0k+z0ZKtxGGPaBUsczSQnPYVthaUcrKiKdCjGGBNWYU0cIjJBRNaLSL6I3Bpge4KIzHO3LxaRLJ9tt7nr14vIOT7rO4vIfBH5UkTWichJ4byGYGWnO0OPbLa5OYwxUS5siUNEPMA/gInAYGCaiAz22206sE9VBwAPAPe6xw4GpgLHAhOAh93zATwIvKGqRwNDgXXhuoZQ5NTeWWWJwxgT3cJZ4xgN5KvqJlWtAOYC/lNRTQKecJfnA2eKM6nuJGCuqpar6mYgHxgtIqnA6cBsAFWtUNXCMF5D0PqnJSMCm6yD3BgT5cI5VlUvYKvP+wJgTEP7qGqViBQB3dz1n/od2wsoBXYBj4nIUGA5cJOq1vszX0SuBa4FyMzMPOKx8YPRLVH4dM0m8mK3h/2zQlVcXNwiZdCWWJnUZ2VSl5VHYG1tkMNYYDhwo6ouFpEHgVuB3/jvqKozgZkAI0eO1JaYEGXwpiXsKS4nN/e0sH9WqPLy8lrtpDCRYmVSn5VJXVYegYWzqWob0MfnfW93XcB9RCQWSAX2NHJsAVCgqovd9fNxEkmrkOPekltdbYMdGmOiVzgTx1JgoIj0F5F4nM7uBX77LAAud5cnA4vcSdIXAFPdu676AwOBJar6LbBVRAa5x5wJrA3jNYQkOz2F0kob7NAYE93C1lTl9lncALwJeIA5qrpGRO4ClqnqApxO7qdEJB/Yi5NccPd7HicpVAHXq6rXPfWNwDNuMtoEXBmuawhVjntL7qZdJfTsnBThaIwxJjzC2sehqguBhX7r7vBZLgN+2MCxM4AZAdavBEY2a6DNJMdnsMNTB6ZFOBpjjAkPe3K8GWV0TCAlIdZuyTXGRDVLHM3IGeww2R4CNMZENUsczcyZRtZqHMaY6GWJo5llpyWzvajMBjs0xkQtSxzNLCfDppE1xkQ3SxzNrGaUXJvUyRgTrSxxNLOsbjWDHVqNwxgTnSxxNLPEOA+9uyRZjcMYE7WaTBwi4hGRL1simGjh3FllNQ5jTHRqMnG4Q32sF5G+LRBPVMhOS2HT7mIb7NAYE5WCHXKkC7BGRJYAtX9Kq+oFYYmqjcvJSKasspod+8voZWNWGWOiTLCJo958F6Zh2WnumFU7iy1xGGOiTlCd46r6PvAl0NF9rXPXmQByMmpGybUOcmNM9AkqcYjIj4AlOCPZ/ghYLCKTwxlYW5aekkDHhFgbs8oYE5WCbaq6HRilqjsBRCQdeAdnBj7jR0TIznA6yI0xJtoE+xxHTE3ScO0J4dh2KSctmY07rcZhjIk+wX75vyEib4rIFSJyBfAafhM0mbqy05P5dn8ZxeU22KExJroE8wCgAH8DHgWOd18zVfWWII6dICLrRSRfRG4NsD1BROa52xeLSJbPttvc9etF5Byf9VtE5AsRWSkiy4K7zJZXMxvgZuvnMMZEmSb7OFRVRWShqh4HvBTsiUXEA/wDOBsoAJaKyAJVXeuz23Rgn6oOEJGpwL3AFBEZjDP/+LFAT+AdETnKZ97xM1R1d7CxREK2mzg27S7muN6pEY7GGGOaT7BNVStEZFSI5x4N5KvqJlWtAOYCk/z2mQQ84S7PB850aziTgLmqWq6qm4F893xtRr9uHYgR51kOY4yJJsHeVTUGuEREvsZ5clxwKiPHN3JML2Crz/sC9zwB91HVKhEpArq56z/1O7aXu6zAWyKiwKOqOjPQh4vItcC1AJmZmeTl5TV1jc2uW6Lw6drN5MXvaPHP9ldcXByRMmjNrEzqszKpy8ojsCYTh1sDuBb4OvzhBOVUVd0mIhnA2yLypap+4L+Tm1BmAowcOVJzc3NbOEwYsnkJ3+4vJzf3tBb/bH95eXlEogxaMyuT+qxM6rLyCCyYQQ4V+Ieqfu3/auLQbUAfn/e93XUB9xGRWCAV51bfBo9V1Zp/dwL/phU3YWWnp7DZBjs0xkSZcPZxLAUGikh/EYnH6exe4LfPAuByd3kysMhNVAuAqe5dV/2BgcASEUkWkY4AIpIMjAdWhxhXi8lJT6GssprtRaWRDsUYY5pN2Po43D6LG4A3AQ8wR1XXiMhdwDJVXQDMBp4SkXxgL05ywd3veWAtUAVcr6peEckE/u20nhELPKuqb4R+2S3j0DSyJfTu0iHC0RhjTPMINnGc0/Qu9anqQvweFFTVO3yWy3DGvwp07Axght+6TcDQw4klEmqe5di0q5ixR6VHOBpjjGkejTZVicg4ALc/I8avf2NESwTYlqWlxNMxMdamkTXGRJWm+jju91l+0W/br5s5lqgjIjaNrDEm6jSVOKSB5UDvTQDZ6clW4zDGRJWmEoc2sBzovQkgJz2F7/aX22CHxpio0VTneLaILMCpXdQs477vH9bIokRO+qHZAI/v3TmywRhjTDNoKnH4ji11v982//cmgEN3VpVY4jDGRIVGE4fNK37k+tYMdmj9HMaYKNFo4hCRL2ikL6OJQQ4NkBDroW/XDnZnlTEmajTVVPU999/r3X+fcv+9FOscD1p2eorVOIwxUaOppqqvAUTkbFU9wWfTLSKyAqg3q5+pLyc9mf/m78ZbrXhi7C5mY0zbFuwghyIip/i8OTmEY9u97PQUyquq2V5ogx0aY9q+YMeqmg7MEZGaOVALgavCElEUqrmzauOuYvp0tcEOjTFtW1CJQ1WXA0NrEoeqFoU1qijjO0pu7qAIB2OMMUcoqOYmEckUkdk484AXichgEZke5tiiRrfkeFKT4thkHeTGmCgQbD/F4zjzavR0338F3ByGeKKSiNiYVcaYqBFs4khT1eeBanAmaQK8YYsqCtkoucaYaBFs4igRkW64z26IyImA9XOEIDs9mZ0HyjlQVhnpUIwx5ogEe1fVz3DmAc8Rkf8C6ThzhJsgZacdGrNqaJ/OkQ3GGGOOQJM1DhHxAGPd18nA/wDHquqqII6dICLrRSRfROo9LCgiCSIyz92+WESyfLbd5q5fLyLn+B3nEZHPROTVpi+xdRiQUXNnlfVzGGPatiYTh6p6gWmqWqWqa1R1tao22d7iJpx/ABOBwcA0ERnst9t0YJ+qDgAeAO51jx0MTAWOBSYAD7vnq3ETsK7Jq2tF+nZNxhMj1s9hjGnzgu3j+K+I/F1EThOR4TWvJo4ZDeSr6iZVrQDmUneYdtz3T7jL84EzRUTc9XNVtVxVNwP57vkQkd7AecCsIGNvFeJjY+jbtYPVOIwxbV6wfRzD3H/v8lmnwLhGjukFbPV5XwCMaWgfVa0SkSKgm7v+U79je7nLfwX+D+jYWMAici1wLUBmZiZ5eXmN7d4iOkkZX2w5GJFYiouLW0UZtCZWJvVZmdRl5RFYsE+OnxHuQIIhIt8DdqrqchHJbWxfVZ0JzAQYOXKk5uY2unuL+PjgOh7/eAunnT62xQc7zMvLozWUQWtiZVKflUldVh6BBVvjQETOw+lzSKxZp6p3NXwE24A+Pu97u+sC7VMgIrFAKrCnkWMvAC4QkXPdODqJyNOqemmw1xFJ2WnJVFRVs21fKX272ZhVxpi2KdghRx4BpgA34sw3/kOgXxOHLQUGikh/EYnH6exe4LfPAuByd3kysEhV1V0/1b3rqj8wEFiiqrepam9VzXLPt6itJA2AnAx3sMPd1s9hjGm7gu0cP1lVL8O5A+p3wEnAUY0d4D5dfgPOUCXrgOdVdY2I3CUiF7i7zQa6iUg+zrMit7rHrgGeB9YCbwDXu3d3tWnZae4tuTstcRhj2q5gm6pqJpI4KCI9cZqTejR1kKouBBb6rbvDZ7kMp/YS6NgZwIxGzp0H5DUVQ2vSNTmezh3i2LTbbsk1xrRdwSaOV0WkM/AnYAXOHVVt6nbY1kBEyE5LthqHMaZNC/auqt+7iy+6T2sn2pwchycnPYW8r3ZFOgxjjDlsQSUOEbkswDpU9cnmDym6Zaen8MLyAvaXVdIpMS7S4RhjTMiCbaoa5bOcCJyJ02RliSNEOe5sgJt2lTDMBjs0xrRBwTZV3ej73u3vmBuOgKJdds384zuLLXEYY9qkYG/H9VcC9G/OQNqLft06EBsjbLJnOYwxbVSwfRyv4E7ihJNsBuM8Z2FCFOdxBzvcabfkGmPapmD7OO73Wa4CvlbVgjDE0y5kp6dYjcMY02YF28fxfrgDaU9y0pP54KtdeKu1xQc7NMaYIxVsU9UBDjVV1dkEqKp2ataoolxOegoV3moK9h2kX7fkSIdjjDEhCbap6q/ADuApnGRxCdDDd/gQE7zs9EPTyFriMMa0NcHeVXWBqj6sqgdUdb+q/pP6s/mZIOW4t+TaNLLGmLYo2MRRIiKXiIhHRGJE5BKcW3LNYeiSHE+XDnE2jawxpk0KNnFcDPwI+A7YiTOi7cXhCqo9yElPYaPVOIwxbVCwd1VtwZqmmlV2ejKLvtwZ6TCMMSZkjdY4ROQaERnoLouIzBGRIhFZJSLDWybE6JSTnsLu4gqKDlZGOhRjjAlJU01VNwFb3OVpwFAgG2e2vgfDF1b0qx2zyh4ENMa0MU0ljipVrfmT+HvAk6q6R1XfAZq8j1REJojIehHJF5FbA2xPEJF57vbFIpLls+02d/16ETnHXZcoIktE5HMRWSMivwv6SlsZ31FyjTGmLWkqcVSLSA8RqRlK/R2fbUmNHSgiHuAfwEScsa2michgv92m48xjPgB4ALjXPXYwMBU4FpgAPOyerxwYp6pDgWHABBE5scmrbIX6dHUGO7Q7q4wxbU1TieMOYBlOc9UCVV0DICJjgU1NHDsayFfVTapagTMMu38H+yTgCXd5PnCmiIi7fq6qlqvqZiAfGK2Omm/aOPcV6In2Vi/OE0Pfbh3YZInDGNPGNJo4VPVVoB9wjKpe47NpGTCliXP3Arb6vC9w1wXcR1WrgCKgW2PHus+SrMS5LfhtVV3cRBytlt2Sa4xpi5q8Hdf9Qt8nIicDWX7HtPgMgKrqBYa5k0n9W0SGqOpq//1E5FrgWoDMzEzy8vJaNM5gxJVWsHlXJe8uei/sgx0WFxe3yjKIJCuT+qxM6rLyCCzYQQ6fAnKAlYDXXa00nji2AX183vd21wXap0BEYoFUYE8wx6pqoYi8h9MHUi9xqOpMYCbAyJEjNTc3t5FQI2NnylYWbl5FzvGjyUoL75hVeXl5tMYyiCQrk/qsTOqy8ggs2EEORwKDVTWU/oSlwEAR6Y/zpT+V+k+bLwAuBz4BJgOLVFVFZAHwrIj8BegJDASWiEg6UOkmjSTgbNwO9bYox2eww3AnDmOMaS7BJo7VQHecEXKDoqpVInID8CbgAeao6hoRuQtYpqoLgNnAUyKSD+zFSS64+z0PrMWZOOp6VfWKSA/gCfcOqxjgebcfpk3KTjs02OGZx0Q4GGOMCVKwiSMNWCsiS3BuiQVAVS9o7CBVXQgs9Ft3h89yGc64V4GOnQHM8Fu3CjghyJhbvS7J8XRNjrdbco0xbUqwiePOcAbRnuWkJ9tDgMaYNsWmjo2w7LQU3ln3XaTDMMaYoAU1rLqInCgiS0WkWEQqRMQrIvvDHVx7kJORzJ6SCgoPVkQ6FGOMCUqw83H8HWeQww04Q41cjTOciDlCNR3k9iCgMaatCDZxoKr5gEdVvar6GM7zE+YI5WTU3FllHeTGmLYh2M7xgyISD6wUkftwbssNOumYhvXpkkScR6zGYYxpM4L98v+xu+8NOHON9wEuCldQ7UmsJ4Z+3ZKtxmGMaTOCvavqa/dJ7R6q2mbnwGitstOS7VkOY0ybEexdVefjjFP1hvt+mDssiGkGORkpfLP3IJXe6kiHYowxTQq2qepOnPk1CgFUdSXQPywRtUPZaclUepWtew9GOhRjjGlSsImjUlWL/Na1yQmUWqOaO6s++GpXhCMxxpimBZs41ojIxYBHRAaKyEPAx2GMq10Z2rszJ2V34/evreOdtfYUuTGmdQs2cdyIM/93OfAcsB+4OUwxtTueGOFfl49kSM9O/PTZFXyycU+kQzLGmAYFlThU9aCq3q6qo1R1pLtcFu7g2pOUhFgev3I0/bp24Jonl7GqoDDSIRljTECN3o7b1J1TTQ2rbkLTJTmep6aPYfIjH3P5nCW8cN1JDMjoGOmwjDGmjqae4zgJ2IrTPLUYCO/E2IbuqYk8PX0Mkx/5hEtnLWH+T06id5cOkQ7LGGNqNdVU1R34FTAEeBBnqtbdqvq+DbUePllpyTw1fTQHK6q4dNZidh0ob/ogY4xpIY0mDndAwzdU9XLgRCAfyHOnhDVhdEyPTjx25Si+21/OZXOWUFRaGemQjDEGCKJzXEQSROQHwNPA9cDfgH8Hc3IRmSAi60UkX0RubeDc89zti0Uky2fbbe769SJyjruuj4i8JyJrRWSNiNwU5HW2SSP6deWRH48gf+cBpj++lNIKb6RDMsaYxhOHiDwJfAIMB37n3lX1e1Xd1tSJRcSDM2fHRGAwME1EBvvtNh3Yp6oDgAeAe91jBwNTcW4BngA87J6vCvi5qg7GqQFdH+CcUWXsUek8OPUEVnyzj+ueXk5FlQ1LYoyJrKZqHJcCA4GbgI9FZL/7OhDEDICjgXxV3aSqFcBcYJLfPpOAJ9zl+cCZIiLu+rmqWq6qm3GayEar6g5VXQGgqgeAdUCv4C71MOzbAqX7wnb6YJ17XA/+8P3jeP+rXfzv8yvxVttD+8aYyGn0ripVPZI5N3rh3JFVowAY09A+qlolIkVAN3f9p37H1kkQbrPWCTh3e9UjItcC1wJkZmaSl5cXUvCxlcWc+Ok17Mw4ha8GRb5LpzswZVA881btoGTvLi4/Nh4nxwanuLg45DKIdlYm9VmZ1GXlEViwEzm1KiKSArwI3KyqAWs+qjoTmAkwcuRIzc3NPYxPuoae/32QnuNvgv6nHXa8zSU3F7q98SUP523k6Jx+3Drx6KCPzcvL4/DKIHpZmdRnZVKXlUdg4ZzFbxvOhE81ervrAu4jIrFAKrCnsWNFJA4naTyjqi+FJfIaY2+FLlnwyk1QWRrWjwrWL88ZxCVj+vLI+xv5Z97GSIdjjGmHwpk4lgIDRaS/O+3sVMD/SfQFwOXu8mRgkaqqu36qe9dVf5x+liVu/8dsYJ2q/iWMsTviO8D5D8LejfD+fWH/uGCICHdNGsL5Q3ty7xtf8uzibyIdkjGmnQlb4lDVKpypZt/E6cR+XlXXiMhdIlIzVMlsoJuI5AM/A251j10DPA+sxZk86npV9QKn4ExjO05EVrqvc8N1DQBk58KwS+Djv8G3X4T1o4LliRH+8qOhnDEondtf/oJXPt8e6ZCMMe1IWPs4VHUhsNBv3R0+y2XADxs4dgYww2/dR0Ri2JPxd8OGt2DBjXD1uxDjafEQ/MV5Ynj4khFcPmcJP3t+JR0TY8kdlBHpsIwx7UA4m6qiR4euMPFe2P4ZLH4k0tHUSor3MOuKkQzM6Mh1Ty9n2Za9kQ7JGNMOWOII1rE/gIHnwKK7Yd/XkY6mVqfEOJ6cPpqeqUlc+fhS1mz3n6jRGGOalyWOYInAeX8GiYFX/xe09TyEl5aSwFNXjyElIZbL5yxh067iSIdkjIliljhC0bkPnHkHbHwXvngh0tHU0atzEk9NH0O1wo9nL2FHUeu4fdgYE30scYRq1NXQexS8fguU7I50NHUMyEjhyatGU1RayaWzFrOn2IZjN8Y0P0scoYrxwPl/g/ID8OavIh1NPUN6pTL78pEU7CvliseWcqDMhmM3xjQvSxyHI3MwnPq/sGoe5L8T6WjqGZPdjX9eOpx1O/Zz9RPLKKu04diNMc3HEsfhOv0XkHaU01FeURLpaOoZd3Qmf/7RUJZs2csNz66gykbUNcY0E0schys2wWmyKvwG3vtDpKMJaNKwXtw1aQjvrNvJ7NXlVFvyMMY0A0scR6LfSTDyKvj0Ydi2PNLRBPTjE/vxi/FH8cl2L3e+ssaShzHmiFniOFJn3QkpmbDg/7WaEXT9XX/GACZkxfLkJ18z4cEPmL+8wGYSNMYcNkscRyoxFc77C3y3Bh6bCEVNzqrb4kSEKYPi+euUYcSI8IsXPmfsn95j1oebKC6vinR4xpg2xhJHczj6XJj2HOzOh5m58E3ASQkjSkS48IRevH7TaTx25Sj6du3A3a+t4+Q/vsuf3vySXQfsmQ9jTHAscTSXQRPh6ncgPhme+B6seCrSEQUkIpwxKIN5/3MS//7pyZyck8bDeRs55d5F/OrfX7B5d+u7Q8wY07pY4mhOGUfDNYug38mw4AZ4/Vbwtt6moBP6duGRH4/g3Z+N5aLhvZi/rIBxf87jp88s5/OthZEOzxjTSlniaG4dusIlL8KJP4XF/4SnfwAHW/dw59npKfzxB8fz0S1ncN3YHD7csJtJ//gv02Z+St76nWgrGtDRGBN5ljjCwRMLE/4Ikx6Gbz6Bf50BO9dFOqomZXRK5JYJR/PxreP41blHs2l3MVc8tpSJD37Iy59to8prd2IZYyxxhNcJl8AVC53bdGedBV++FumIgtIxMY5rT8/hw/8bx32Tj6fSW83N81Yy9k95PPbfzRysaL3Nb8aY8Atr4hCRCSKyXkTyReTWANsTRGSeu32xiGT5bLvNXb9eRM7xWT9HRHaKyOpwxt5s+oyCa/Oc4UnmXgzv39eq5vJoTHxsDD8a2Ye3/3cs/7psJN1TE/ndK2s5+Z5F/OXtr9hbUhHpEI0xERC2xCEiHuAfwERgMDBNRAb77TYd2KeqA4AHgHvdYwcDU4FjgQnAw+75AB5317UdnXrClQvh+Cnw3gx44fJWOb5VQ2JihLMHZ/LiT05m/nUnMbJfF/727gZOvuddbv/3F3ycv5tKa8Yypt2IDeO5RwP5qroJQETmApOAtT77TALudJfnA38XEXHXz1XVcmCziOS75/tEVT/wrZm0GXFJ8P1HIXMIvPNb2LMRpj4LXfpFOrKQjMzqyqysrmz47gCPfrCJF5YX8Mzib+iYGEvuoAzOOiaD3KMySO0QF+lQjTFhEs7E0QvY6vO+ABjT0D6qWiUiRUA3d/2nfsf2CuXDReRa4FqAzMxM8vLyQjk8jI6n65DfMHjt/VQ/fCprjr2Fos5Dwv6pxcXFzV4G30uHs3ITWbPHy8qdXvLWbeeVz7cTIzCoSwzDMmI5IcNDRofW2ZUWjjJp66xM6rLyCCyciSOiVHUmMBNg5MiRmpubG9mA6siFsefDc9M4YdVvYeK9zsyCYZSXl0e4yqCm3dBbrazcWsi7677jnXXf8dyXxTz3JQzMSOHMYzI5e3AGw/p0wRMjYYkjVOEsk7bKyqQuK4/Awpk4tgF9fN73dtcF2qdARGKBVGBPkMe2bWkD4Zp34cWr4bWfw2fPwIjLYchFkNAx0tEdFk+MMKJfF0b068L/TTiab/Yc5J113/Hul98x68NNPPL+RromxzPuaKdJ67SB6SQnRO3fLsZErXD+r10KDBSR/jhf+lOBi/32WQBcDnwCTAYWqaqKyALgWRH5C9ATGAgsCWOskZGYCtPmwrI5sHQ2vHITvPErGPJ9GH65M7e5tI6/zg9H324duOrU/lx1an+KSit5/6tdvLvuO95a8y3zlxcQ74nhpJxunHVMBqP7d2NARkqrqY0YYxoWtsTh9lncALwJeIA5qrpGRO4ClqnqAmA28JTb+b0XJ7ng7vc8Tkd6FXC9qnoBROQ5IBdIE5EC4LeqOjtc1xF2MR4YfY3TVFWwDFY8Aatfgs+ehvRjYPhlzt1Yyd0iHekRSU2K44KhPblgaE8qvdUs27KPd9wmrd/8Zw0AyfEeju/dmaF9OjOsT2dO6NuZzE6JEY7cGOMvrO0EqroQWOi37g6f5TLghw0cOwOYEWD9tGYOs3UQcZ756DPKeep89Uuw4kl48zbnLqyjv+ckkf5jIaZ1djYHK86taZyU041fn3cMW/YcZMXX+/i8oJCVWwuZ9eGm2qlue6QmMqzPoWRyXK9Ua94yJsLsf2BrlNDR6e8YcTl8uxo+ewo+nwtrXoLO/WD4j2HYJc7zIW2ciNA/LZn+aclcNKI3AGWVXtZs38/KrU4i+XxrIa+v/haAGIGjMjtyQt/ODO3dmWF9OzMwo6M1cRnTgixxtHbdhzh3XZ31O/jyVacpa9HdzjznA8c7fSEDxzvjY0WJxDhPbSd7jT3F5U6N5JtCPttayGurdvDcEudu7+R4D4N7dmJARkcGZKQwMCOFgZkpdO+UiLThPiJjWqvo+baJdnGJcNxk57V3k9MH8tkz8NUbkNIdhl3s1ES6Zkc60rDolpLAuKMzGXd0JgDV1cqWPSW1tZJ1O/bz+uodFB6srD0mJSGWARkpdZLJwIyO9OqcRIzVUIw5bJY42qKu2XDmHZD7K9jwltMX8t+/wkd/gazTYMQVTp9IXPR2LMfECNnpKWSnp/CD4U4Tl6qyp6SCDd8Vk7/zABt2FpO/s5j3v9rF/OUFtccmxsWQk55CJy1jjeaTk+4klX5dOxDradv9R8a0BEscbZkn1pm29uhzYf92WPmMM/Pgi9MhsbNTO+k9Grofh1RH/4i2IkJaSgJpKQmclFP3LrSig5Xk7zrAhu+KaxPK6m8O8Mmb62v3iffE0LtrEr06O6+efv92T00kPtYSizGWOKJFp55w+i/h1J/Dlg+cWshnT8PSWQCcJnGw4Vjofhx0P975N/NYSOwU4cBbRmqHOEb068qIfl1r1+Xl5THqpFPZuKu4NqF8s7eEbYVlrFu3k93FdedhF4GMjgn0dJNJb/df55VIr85JpCbFWb+KiXqWOKJNTAxk5zovbxXs2QDffkHB0tfoG1cI6xc6d2nV6NLf6YCvSSbdj4NOvdr0g4ehSE6I5fjenTm+d+d628oqvXxbVMa2wlK2FZay3X1tKyxl7fb9vL32Oyqq6o4KnBzv8UkmSfTu4iSVnqlJ9OqSRGanROKsOcy0cZY4opknFjKOgYxj2LQ3g765uc5cIAe+hW+/gG9Xuf9+AeteOXRcUpe6NZPuxznziXja14i3iXEestKSyUpLDri9pk9l275DCWV7YRnbCg+yvbCM1duK2OM3Z0mMQGanxNrmr/SOCXRNjqdLh3i6Jte84ujSIZ7OHeLtNmPTKlniaG9EoFMP53XU+EPryw/Ad2vrJpOls6CqzNnuiYf0o+smk+5DnGFT2infPpWhfToH3Ke0wsv2It/aSlltolm5tZA9xeWUVHgbOL/zxH3X5Hi6doini++/yXF0TU6oTTJdk531HRNiranMhJ0lDuNI6Ah9xzivGt4q2Luxbu3kqzdg5dOH9uncz5ljpEsWpPau+0pObzdNXg1JiveQk55CTnpKg/uUVXrZd7CCvSUV7CupZO/BCvaVOO/3llTUvt+69yCrCgrZW1JBpTfwLJJxHjmUSGoTiptkOsS5SaduDScxzhPwXMY0xBKHaZgnFtIHOa/jJjvrVKH4u7rJ5Lu1sOk9qDzod3wCpPZyE0kfv8TSx+lLie/Q8tfVyiTGeeiRmkSP1KSg9ldVisur6iWZfQcr2FNS9/2X3+5n38FK9h2saHDG4g7xntpEouVlvPztZ4dqM3VqOc6rc1Kc3bbczlniMKERgY7dndfAsw+tV4XSfVC0FYq2QVGBu1zgvDa+Bwd2AH7fXh261U0kvokltTekZLb5sbmam4jQMTGOjolx9O0WXOL1VitFpZW1CWWvm2BqE42bgL4uVlZ849RqissbvoU73hNDYlwMiXEekuI9JMV5nOU4D4lxMSTFH3pfuy3eb584D4nxfvvEeUiMj6l9bzcStE6WOEzzEIEOXZ1Xj6GB9/FWOs+b1CSToq2w300yezfBpveh4kDdY2LinFuNA9VYamozbXT+kpbkiZHaGkNjfCcuKq/yUniwsjbJ7HUTTuHBSkorvZRWeCmvcv4trfRSWllNWYWXPSUVlO5z1pVVHtpe3UCNpzGxMVInwdQmHL+EVZukfJLOoXWeQ0mugePiPGJ9QyGwxGFajifOmWO9sXnWy4rqJpba5QL4+r9O4lG/zuTE1PqJpVMvZ318svvq6LOc7AxnbxqVEOshs5OnWYa2V1UqvVqbTMoqvbXJ59C66jrvSyu8lFV5Ka2oDnjcvpIKttccV+mlzD226jAylKcmQfklmLKSUuZsWkKSm7CS4j0kxB5KPjVJLTE2ps66BL8k5ayLISE2JioSlCUO07okpjqvzGMDb/dWOX0sgRJLUQF88ymUFTb9ObFJnCzxsLKzU2PxTSrxKX7L/u99lhPc93HJUTXQZHMTEeJjhfjYGFKTwntbd6W3ujbBlPkkndLadTXJqbpukvLdx1337UHYX1rJzv1+Ca2ymgpvddPB+BGhTtNcTbNevVqST9Neok/SSoyr26yXFB8T8LhwJyj7TTdtiyfWbaLqBYwJvE/5Adi/w/m3ohgqStxXsc+/xezasoFeaamH1tUc57uvtzzwZwQSmxh6wqlZH9fBOd4TB7EJzu3Pnvi6y554Z3sU/MUaTnGeGOI8MXRMPPIE5TTdnRJwW5W3mrKq6vqJp8JLWVV1nXVlfkmrNEBNqaS8it3FFXWa98oqvZRXhZ6gwBmTrWdqEot+kXsEJRCYJQ4TfRI6QnrT/R4b8vLo5bbnN8hb6Zd4fBORT4Ip99/ms1z8Xd33Nc/GHC6Pm0xi4xtOMLHxh7Vf9x2bYNWuusf4Hxeb4CQwT4LPfglO8187SmqxnhhSPDGkhHlisepqdZvsDiWcOknKr5ZU6m4vq/SG7eaCsF6xiEwAHsSZOnaWqt7jtz0BeBIYAewBpqjqFnfbbcB0wAv8P1V9M5hzGtOsPHGQ1Nl5NRdvFVSW1E843nInUVW5/3rLwVsBVRV+yz6vqnKf5Zr15c5yebHffpWHttXs5+dogPX1VgdJ3KSS4FNzchPMBQ/VfUbIBC0mRugQH0uH+Nbzd37YIhERD/AP4GygAFgqIgtUda3PbtOBfao6QESmAvcCU0RkMM7848cCPYF3ROQo95imzmlM6+aJBU9q5J+6V4XqqjrJ59OP3ufEUSOOPGnVLNckwoSGH4A0bU84U9hoIF9VNwGIyFxgEuD7JT8JuNNdng/8XZwenUnAXFUtBzaLSL57PoI4pzEmGCJujeBQX0BZUiakDYhgUKYtCGfi6AVs9XlfQP3ezNp9VLVKRIqAbu76T/2O7eUuN3VOAETkWuBagMzMTPLy8g7rIqJFcXFxuy8Df1Ym9VmZ1GXlEVjraTRrZqo6E5gJMHLkSM1tqhM0yvk+2GUcVib1WZnUZeURWDif598G9PF539tdF3AfEYkFUnE6yRs6NphzGmOMCaNwJo6lwEAR6S8i8Tid3Qv89lkAXO4uTwYWqaq666eKSIKI9AcGAkuCPKcxxpgwCltTldtncQPwJs6ts3NUdY2I3AUsU9UFwGzgKbfzey9OIsDd73mcTu8q4HpVZ5yJQOcM1zUYY4ypL6x9HKq6EFjot+4On+Uy4IcNHDsDmBHMOY0xxrQcG7PYGGNMSCxxGGOMCYloQ9OCRRER2QV8Hek4IiwN2B3pIFoZK5P6rEzqas/l0U9V0wNtaBeJw4CILFPVkZGOozWxMqnPyqQuK4/ArKnKGGNMSCxxGGOMCYkljvZjZqQDaIWsTOqzMqnLyiMA6+MwxhgTEqtxGGOMCYklDmOMMSGxxBFlRGSCiKwXkXwRuTXA9itEZJeIrHRfV0cizpYiInNEZKeIrG5gu4jI39zyWiUiw1s6xpYWRJnkikiRz+/IHYH2ixYi0kdE3hORtSKyRkRuCrBPu/s9aYwljijiM13vRGAwMM2dhtffPFUd5r5mtWiQLe9xYEIj2yfijL48EGfir3+2QEyR9jiNlwnAhz6/I3e1QEyRVAX8XFUHAycC1wf4f9Mef08aZIkjutRO16uqFUDN1Lrtlqp+gDPyckMmAU+q41Ogs4j0aJnoIiOIMmlXVHWHqq5wlw8A6zg042iNdvd70hhLHNEl0HS9/v8BAC5yq9vzRaRPgO3tSbBl1t6cJCKfi8jrInJspINpKSKSBZwALPbbZL8nPixxtD+vAFmqejzwNvBEhOMxrc8KnHGKhgIPAS9HNpyWISIpwIvAzaq6P9LxtGaWOKJLk1PrquoeVS13384CRrRQbK2VTUfsR1X3q2qxu7wQiBORtAiHFVYiEoeTNJ5R1ZcC7GK/Jz4scUSXJqfW9WuXvQCnPbc9WwBc5t41cyJQpKo7Ih1UJIlIdxERd3k0zvfEnshGFT7utc4G1qnqXxrYzX5PfIR1BkDTsoKcrvf/icgFOHeS7AWuiFjALUBEngNygTQRKQB+C8QBqOojOLNJngvkAweBKyMTacsJokwmAz8RkSqgFJiq0T3ExCnAj4EvRGSlu+5XQF9ov78njbEhR4wxxoTEmqqMMcaExBKHMcaYkFjiMMYYExJLHMYYY0JiicMYY0xILHGYdk1EshoZJXZWzWB3IvKrlo0sOL4xhnhcg9dtTFPsdlzTrrljE72qqkOa2K9YVVNaKKZYVa0K82dkEcR1GxOI1TiMgVgReUZE1rkDP3YAEJE8ERkpIvcASe7cFM+ISLKIvOYOArhaRKb4n9A99kH3mNXuE9i4x84RkSUi8pmITHLXXyEiC0RkEfCu37myROTLJmLsJyIbRCRNRGJE5EMRGS8iHhH5k4gsdQe2/J9wF6aJfpY4jIFBwMOqegywH/ip70ZVvRUodeemuARnLovtqjrU/Yv9jQbO20FVh7nnm+Ouux1YpKqjgTOAP4lIsrttODBZVcceRoxfA/fizBPxc2Ctqr4FTMcZHmMUMAq4RkT6B1UqxjTAEocxsFVV/+suPw2c2sT+XwBni8i9InKaqhY1sN9zUDv/RScR6QyMB251h7bIAxJxh7YA3lbVhubJaDJGd1KuTsB1wC/c1eNxxlhaiTNUeDecyYiMOWw2VpUx4N/R12jHn6p+5U4dei5wt4i828AseYHOK8BFqrred4OIjAFKjiRGt/mqt/s2BTjgft6Nqvqm375ZjXyWMY2yGocx0FdETnKXLwY+CrBPpTv0NiLSEzioqk8Df8JpYgpkirv/qTjNRUU4A1De6DP67AnNGOO9wDPAHcC/3HVv4gxYWBP7UT5NY8YcFqtxGAPrceaZngOsJfB80jOBVSKyAngSp2+iGqgEftLAectE5DOckWevctf9Hvire64YYDPwvSONUUTG4vRhnKKqXhG5SESuxJlzJQtY4SarXcCFQXyeMQ2y23GNCQMRyQN+oarLmuFcWdits6YVsaYqY4wxIbEahzHGmJBYjcMYY0xILHEYY4wJiSUOY4wxIbHEYYwxJiSWOIwxxoTk/wOmdKXSmhYYQgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_rd_curve(curve_dict, \"MeanSquaredError\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "d97d40aa",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:title={'center':'MultiscaleStructuralSimilarity vs bits-per-pixel'}, xlabel='bits per pixel', ylabel='MS-SSIM (dB)'>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plotting MS-SSIM in dB as is done in the Scale Hyperprior paper.\n",
    "plot_rd_curve(\n",
    "    curve_dict, \n",
    "    \"MultiscaleStructuralSimilarity\", \n",
    "    y_transform = lambda d: -10*math.log10(1 - d), \n",
    "    y_label = \"MS-SSIM (dB)\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "abd0f51e",
   "metadata": {},
   "source": [
    "# Conclusion"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7aa9466e",
   "metadata": {},
   "source": [
    "Check out the [torchmetrics documentation](https://torchmetrics.readthedocs.io/en/latest/) for more details on metric features like syncing state across processes and compatability with PyTorch Lightning."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ba4e3924",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
